/**
 * @file BatchCommandImpl.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Shell : Gestion des fonctionnalités relatives au mode 'batch'
 */
package ecom.shell;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.util.StringTokenizer;

/**
 * @brief Shell : Gestion des fonctionnalités relatives au mode 'batch'
 * @author Sebastien
 */
public class BatchCommandImpl implements ShellCommand {

    private ShellContext _context = null;

    public BatchCommandImpl(ShellContext context) {
        _context = context;
    }

    /**
     * @brief Renvoie le nom de la commande
     * @return le nom de la commande
     */
    public String getName() {
        return "batch";
    }

    /**
     * @brief Renvoie la manière d'utiliser la commande
     * @return la manière d'utiliser la commande
     */
    public String getUsage() {
        return "batch [-stopOnError] filename";
    }

    /**
     * @brief Renvoie la description de la commande
     * @return la description de la commande
     */
    public String getShortDescription() {
        return "run commands\n";
    }

    /**
     * @brief Exécute la commande
     * @param cmdline : commande à exécuter
     * @param out : flux d'affichage std
     * @param err : flux d'affichage err
     * @return les données à afficher
     * @throws java.lang.Exception : erreur durant l'exécution de la méthode
     */
    public String execute(String cmdline, PrintStream out, PrintStream err) throws Exception {
        //StringBuffer res = new StringBuffer();
        Shell shell = (Shell) _context.getVar("shellMaster");
        StringTokenizer st = new StringTokenizer(cmdline, " ");
        String filePath = "";
        String cmd = "";
        boolean stopOnError;
        InputStream in = null;

        // Ignore the command name.
        st.nextToken();

        int sleep = Integer.parseInt(st.nextToken());

        if (st.countTokens() == 1) {
            out.println("  [stopOnError = FALSE]");
            stopOnError = false;
        } else if (st.countTokens() == 2) {
            st.nextToken();
            out.println("  [stopOnError = TRUE]");
            stopOnError = true;
        } else {
            err.println(Shell.INCORRECT_ARGS_NUMBER);
            return "";
        }
        filePath = st.nextToken();

        // Test de l'existence fichier (+ acces au fichier)
        try {
            in = new FileInputStream(filePath);

            // Lecture des commandes (+ execution)
            InputStreamReader inReader = new InputStreamReader(in);
            BufferedReader br = new BufferedReader(inReader);

            while ((cmd = br.readLine()) != null) {
                out.println("\n  [BATCH command] -> " + cmd + "\n");
                try {
                    out.println(shell.executeCommand(cmd, out, err));
                    //shell.wait(sleep);
                } catch (Exception ex) {
                    if (stopOnError == true) {
                        err.println("Error and stopOnError ON : stop batch execution");
                        err.println(ex);
                        return "";
                    } else {
                        err.println("Shell :" + ex);
                        //shell.wait(sleep);
                    }
                }
            }
            br.close();
        } catch (FileNotFoundException e) {
            err.println("File \"" + filePath + "\" not found" + e);
        } catch (IOException e) {
            err.println("Error : " + e);
        }
        return "";
    }
}